package com.roc.jpamysql.aop;

import com.roc.jpamysql.model.LogInfo;
import com.roc.jpamysql.service.ILogInfoService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 2024/3/23 9:33 下午
 *
 * @author rocpeng
 */
@Slf4j
@Aspect
@Component
public class SysLogAspect {

    @Resource
    ILogInfoService iLogInfoService;

    @Resource
    SysLogCreator sysLogCreator;

//    /**
//     * 通配符切
//     *
//     * @param pjp
//     * @return
//     * @throws Throwable
//     */
//    @Around("execution(public * com.roc.jpamysql.controller.*.*(..))")
//    public Object postLogAspect(ProceedingJoinPoint pjp) throws Throwable {
//        //记录开始接口时间
//        LogInfo log = sysLogCreator.createOpLog();
//        //执行方法
//        Object result = sysLogCreator.proceedController(pjp, log);
//        // 保存日志
//        iLogInfoService.save(log);
//        return result;
//    }


    /**
     * 定义切点 @Pointcut 在注解的位置切入代码
     */
    @Pointcut("@annotation( com.roc.jpamysql.annotation.SysLog)")
    public void logPointCut() {
    }


    /**
     * 环绕通知 用于拦截指定内容，记录用户的操作
     * pjp:ProceedingJoinPoint 是切入点对象
     *
     * @param pjp 切入点
     */
    @Around("logPointCut()")
    public Object postLogAnnotationAspect(ProceedingJoinPoint pjp) throws Throwable {
        // 创建 log
        LogInfo log = sysLogCreator.createOpLog();
        //执行方法
        Object result = sysLogCreator.proceedController(pjp, log);
        //获取操作类型
        log.setType(sysLogCreator.getLogType(pjp));
        // 保存日志
        iLogInfoService.save(log);
        return result;
    }


}

